home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
program
/
progem.lzh
/
wind1.prf
< prev
next >
Wrap
Text File
|
1987-06-23
|
13KB
|
288 lines
.!****************************************************************************
.!
.! ANTIC PUBLISHING INC., COPYRIGHT 1985. REPRINTED BY PERMISSION.
.!
.! ** Professional GEM ** by Tim Oren
.!
.! Proff File by ST enthusiasts at
.! Case Western Reserve University
.! Cleveland, Ohio
.! uucp : decvax!cwruecmp!bammi
.! csnet: bammi@case
.! arpa : bammi%case@csnet-relay
.! compuserve: 71515,155
.!
.!****************************************************************************
.!
.!
.!****************************************************************************
.!
.! Begin Part I
.!
.!****************************************************************************
.!
.PART I Windows
.SH IN THE BEGINNING
In GEM, creating a window and displaying it are two different functions. The
creation function is called wind_create, and its calling sequence is:
.FB wind_create()
handle = wind_create(parts, xfull, yfull, wfull, hfull);
.FE
This function asks GEM to reserve space in its memory for a new window
description, and to return a code or "handle" which you can use to refer to the
window in the future. Valid window handles are positive integers; they are not
memory pointers.
.PP
GEM can run out of window handles. If it does so, the value returned is
negative. Your code should always check for this situation and ask the
program's user to close some windows and retry if possible. Handle zero is
special. It refers to the "desktop", which is predefined as light green (or
gray) on the ST. Window zero is always present and may be used, but never
deleted, by the programmer.
.PP
The xfull, yfull, wfull, and hfull parameters are integers which determine
the maximum size of the window. Xfull and yfull define the upper left corner of
the window, and wfull and hfull specify its width and height. (Note that all of
the window coordinates which we use are in pixel units.)
.PP
GEM saves these values so that the program can get them later when processing
FULL requests. Usually the best maximum size for a window is the entire
desktop area, excepting the menu bar. You can find this by asking wind_get for
the working area of the desktop (handle zero, remember):
.FB wind_get()
wind_get(0, WF_WXYWH, &xfull, &yfull, &wfull, &hfull);
.FE
Note that WF_WXYWH, and all of the other mnemonics used in this article, are
defined in the GEMDEFS.H file in the ST Toolkit.
.PP
The parts parameter of wind_create defines what features will be included in
the window when it is drawn. It is a word of single bit flags which indicate
the presence/absence of each feature. To request multiple features, the flags
are "or-ed" together. The flags' mnemonics and meanings are:
.BO
NAME - A one character high title bar at the top of the window.
.EO
.BO
INFO - A second character line below the NAME.
.EO
.BO
MOVER - This lets the user move the window around by "dragging" in the NAME
area. NAME also needs to be defined.
.EO
.BO
CLOSER - A square box at the upper left. Clicking this control point asks
that the window be removed from the screen.
.EO
.BO
FULLER - A diamond at upper right. Clicking this control point requests
that the window grow to its maximum size, or shrink back down if it is already
big.
.EO
.BO
SIZER - An arrow at bottom right. Dragging the SIZER lets the user choose
a new size for the window.
.EO
.BO
VSLIDE - defines a right-hand scroll box and bar for the window. By dragging
the scroll bar, the user requests that the window's "viewport" into the
information be moved. Clicking on the gray box above the bar requests that
the window be moved up one "page". Clicking below the bar requests a down page
movement. You have to define what constitutes a page or line in the
context of your application.
.EO
.BO
UPARROW - An arrow above the right scroll bar. Clicking here requests that
the window be moved up one "line". Sliders and arrows almost always appear
together.
.EO
.BO
DNARROW - An arrow below the right scroll bar. Requests that window be
moved down a line.
.EO
.BO
HSLIDE - These features are the horizontal equivalent of the RTARROW
above. They appear at the bottom of the window. Arrows LFARROW usually
indicate "character" sized movement left and right. "Page" sized
movement has to be defined by each application.
.EO
.PP
It is important to understand the correspondence between window features and
event messages which are sent to the application by the GEM window manager. If
a feature is not included in a window's creation, the user cannot perform the
corresponding action, and your application will never receive the matching
message type. For example, a window without a MOVER may not be dragged by the
user, and your app will never get a WM_MOVED message for that window.
.PP
Another important principle is that the application itself is responsible for
implementing the user's window action request when a message is received. This
gives the application a chance to accept, modify, or reject the user's request.
.PP
As an example, if a WM_MOVED message is received, it indicates that the user
has dragged the window. You might want to byte or word align the requested
position before proceeding to move the window. The wind_set calls used to
perform the actual movements will be described in the next article.
.SH OPEN, SESAME!
The wind_open call is used to actually make the window appear
on the screen. It animates a "zoom box" on the screen and then draws in the
window's frame. The calling sequence is:
.FB wind_open()
wind_open(handle, x, y, w, h);
.FE
The handle is the one returned by wind_create. Parameters x, y, w, and h
define the initial location and size of the window. Note that these
measurements INCLUDE all of the window frame parts which you have requested. To
find out the size of the area inside the frame, you can use
.FB wind_get()
wind_get(handle, WF_WXYWH, &inner_x, &inner_y, &inner_w, &inner_h);
.FE
Whatever size you choose for the window display, it cannot be any larger than
the full size declared in wind_create.
.PP
Here is a good place to take note of a useful utility for calculating window
sizes. If you know the "parts list" for a window, and its inner or outer size,
you can find the other size with the wind_calc call:
.FB wind_calc()
wind_calc(parts, kind, input_x, input_y, input_w, input_h, &output_x,
&output_y, &output_w, &output_h);
.FE
Kind is set to zero if the input coordinates are the inner area, and you are
calculating the outer size. Kind is one if the inputs are the outer size and
you want the equivalent inner size. Parts are just the same as in wind_create.
.PP
There is one common bug in using wind_open. If the NAME feature is
specified, then the window title must be initialized BEFORE opening the window:
.FB wind_set()
wind_set(handle, WF_NAME, ADDR(title), 0, 0);
.FE
If you don't do this, you may get gibberish in the NAME area or the system
may crash. Likewise, if you have specified the INFO feature, you must make a
wind_set call for WF_INFO before opening the window.
.PP
Note that ADDR() specifies the 32-bit address of title. This expression is
portable to other (Intel-based) GEM systems. If you don't care about
portability, then &title[0], or just title alone will work fine on the ST.
.SH CLEANING UP
When you are done with a window, it should be closed and
deleted. The call
.FB wind_close()
wind_close(handle);
.FE
takes the window off the screen, redraws the desktop underneath it,
and animates a "zoom down" box. It doesn't delete the window's
definition, so you can reopen it later.
.PP
Deleting the window removes its definition from the system, and makes that
handle available for reuse. Always close windows before deleting, or you may
leave a "dead" picture on the screen. Also be sure to delete all of your
windows before ending the program, or your app may "eat" window handles. The
syntax for deleting a window is:
.FB wind_delete()
wind_delete(handle);
.FE
.SH THOSE FAT SLIDERS
One of ST GEM's unique features is the proportional
slider bar. Unlike other windowing systems, this type of bar gives visual
feedback on the fraction of a document which is being viewed, as well as the
position within the documen